#include "tateti.h"

void InicializarTablero(int mat[][TABLERO])
{
	int f,c;
	
	for(f = 0; f < TABLERO; ++f)
		for(c = 0; c < TABLERO; ++c)
			mat[f][c] = SIN_FICHA;	// char >> mat[f][c] = ' ';
}

void ImprimirTablero(int mat[][TABLERO])
{
	int f,c;
	
	for(f = 0;f<TABLERO; f++)
	{
		for( c = 0; c < TABLERO; c++)
			switch(mat[f][c])
			{
				case FICHA_O:
						printf("| 1 |");
						break;

				case FICHA_X:
						printf("| 2 |");
						break;

				default:
						printf("| 0 |");
						break;
			}
		printf("\n");
	}
}

void BuscarCoordenadas(int mat[][TABLERO], int posicion, int *fDestino, int *cDestino)
{
	int f,c,pos=1;
	
	for(f = 0; f < TABLERO; f++)
		for(c = 0; c < TABLERO; c++)
		{
			if(pos == posicion)
			{
				*fDestino = f;
				*cDestino = c;
				return;
			}
			pos++;
		}
}

void SeleccionaTurno(int *turno)
{
	*turno = *turno == FICHA_O? FICHA_X : FICHA_O;
}

int ColocarFicha(int mat[][TABLERO], int FichaJugador, int fDestino, int cDestino)
{
	if(mat[fDestino][cDestino] != SIN_FICHA)
		return 0;

	mat[fDestino][cDestino] = FichaJugador;
	return 1;
}

int EjecutarSeleccion(int mat[][TABLERO], int FichaJugador, int fOrigen, int cOrigen)
{
	if(!(mat[fOrigen][cOrigen] == FichaJugador) || !SeleccionValida(mat, fOrigen, cOrigen))
		return 0;

	return 1;
}

int	SeleccionValida(int mat[][TABLERO], int fOrigen, int cOrigen)
{
	/*return ((fOrigen+1 < TABLERO && cOrigen-1 >= 0 && mat[fOrigen+1][cOrigen-1] == SIN_FICHA
										&& ((fOrigen != 0 || cOrigen != 1) && (fOrigen != 1 || cOrigen != 0)
										&& (fOrigen != 1 || cOrigen != 2) && (fOrigen != 2 || cOrigen != 1) ))
								|| (fOrigen+1 < TABLERO 					 && mat[fOrigen+1][cOrigen] == SIN_FICHA)
								|| (fOrigen+1 < TABLERO && cOrigen+1 < TABLERO && mat[fOrigen+1][cOrigen+1] == SIN_FICHA
										&& ((fOrigen != 0 || cOrigen != 1) && (fOrigen != 1 || cOrigen != 0) && (fOrigen != 1 || cOrigen != 2)
										&& (fOrigen != 2 || cOrigen != 1) ))
				|| (cOrigen-1 >= 0						 && mat[fOrigen][cOrigen-1] == SIN_FICHA)
				|| (cOrigen+1 < TABLERO					 && mat[fOrigen][cOrigen+1] == SIN_FICHA)
				|| (fOrigen-1 >= 0		&& cOrigen-1 >= 0		 && mat[fOrigen-1][cOrigen-1] == SIN_FICHA
										&& ((fOrigen != 0 || cOrigen != 1) && (fOrigen != 1 || cOrigen != 0) && (fOrigen != 1 || cOrigen != 2)
										&& (fOrigen != 2 || cOrigen != 1) ))
				|| (fOrigen-1 >= 0						 && mat[fOrigen-1][cOrigen] == SIN_FICHA)
				|| (fOrigen-1 >= 0		&& cOrigen+1 < TABLERO && mat[fOrigen-1][cOrigen+1] == SIN_FICHA
										&& ((fOrigen != 0 || cOrigen != 1) && (fOrigen != 1 || cOrigen != 0) && (fOrigen != 1 || cOrigen != 2)
										&& (fOrigen != 2 || cOrigen != 1) )) );*/
	return ((fOrigen+1 < TABLERO && cOrigen-1 >= 0 && mat[fOrigen+1][cOrigen-1] == SIN_FICHA
					&& ((fOrigen == 0 && cOrigen == 2) || (fOrigen == 1 && cOrigen == 1)))
								|| (fOrigen+1 < TABLERO && mat[fOrigen+1][cOrigen] == SIN_FICHA && fOrigen != 2)
								|| (fOrigen+1 < TABLERO && cOrigen+1 < TABLERO && mat[fOrigen+1][cOrigen+1] == SIN_FICHA
										&& ((fOrigen == 0 && cOrigen == 0) || (fOrigen == 1 && cOrigen == 1)))
				|| (cOrigen-1 >= 0 && mat[fOrigen][cOrigen-1] == SIN_FICHA && cOrigen != 0)
				|| (cOrigen+1 < TABLERO	&& mat[fOrigen][cOrigen+1] == SIN_FICHA && cOrigen != 2)
				|| (fOrigen-1 >= 0 && cOrigen-1 >= 0 && mat[fOrigen-1][cOrigen-1] == SIN_FICHA
										&& ((fOrigen == 1 && cOrigen == 1) || (fOrigen == 2 && cOrigen == 2)))
				|| (fOrigen-1 >= 0 && mat[fOrigen-1][cOrigen] == SIN_FICHA && fOrigen != 0)
				|| (fOrigen-1 >= 0 && cOrigen+1 < TABLERO && mat[fOrigen-1][cOrigen+1] == SIN_FICHA
					&& ((fOrigen == 1 && cOrigen == 1) || (fOrigen == 2 && cOrigen == 0))));
}

int EjecutarJugada(int mat[][TABLERO], int FichaJugador, int fOrigen, int cOrigen, int fDestino, int cDestino)
{
	if(!(mat[fDestino][cDestino] == SIN_FICHA) || !DestinoValido(mat, fOrigen, cOrigen, fDestino, cDestino))
		return 0;

	return 1;
}

int	DestinoValido(int mat[][TABLERO], int fOrigen, int cOrigen, int fDestino, int cDestino)
{
//	return ((fDestino == fOrigen+1 && cDestino == cOrigen-1 && ((fOrigen == 1 && cOrigen == 1) || (fOrigen == 0 && cOrigen == 0)
//								|| (fOrigen == 2 && cOrigen == 2) || (fOrigen == 2 && cOrigen == 0) || (fOrigen == 0 && cOrigen == 2) ))
//								|| (fDestino == fOrigen+1 && cDestino == cOrigen)
//				|| (fDestino == fOrigen+1 && cDestino == cOrigen+1
//										&& ((fOrigen == 1 && cOrigen == 1) || (fOrigen == 0 && cOrigen == 0)
//										|| (fOrigen == 2 && cOrigen == 2) || (fOrigen == 2 && cOrigen == 0) || (fOrigen == 0 && cOrigen == 2) ))
//				|| (fDestino == fOrigen	 && cDestino == cOrigen-1)
//				|| (fDestino == fOrigen	 && cDestino == cOrigen+1)
//				|| (fDestino == fOrigen-1 && cDestino == cOrigen-1
//										&& ((fOrigen == 1 && cOrigen == 1) || (fOrigen == 0 && cOrigen == 0)
//				|| (fOrigen == 2 && cOrigen == 2) || (fOrigen == 2 && cOrigen == 0) || (fOrigen == 0 && cOrigen == 2) ))
//				|| (fDestino == fOrigen-1 && cDestino == cOrigen)
//				|| (fDestino == fOrigen-1 && cDestino == cOrigen+1
//										&& ((fOrigen == 1 && cOrigen == 1) || (fOrigen == 0 && cOrigen == 0)
//										|| (fOrigen == 2 && cOrigen == 2) || (fOrigen == 2 && cOrigen == 0) || (fOrigen == 0 && cOrigen == 2) )) );
		return (	 (fDestino == fOrigen+1 && cDestino == cOrigen-1 && ((fOrigen == 0 && cOrigen == 2) || (fOrigen == 1 && cOrigen == 1)))
						|| (fDestino == fOrigen+1 && cDestino == cOrigen	 && fOrigen != 2)
			|| (fDestino == fOrigen+1 && cDestino == cOrigen+1 && ((fOrigen == 0 && cOrigen == 0) || (fOrigen == 1 && cOrigen == 1)))
			|| (fDestino == fOrigen	 && cDestino == cOrigen-1 && cOrigen != 0)
			|| (fDestino == fOrigen	 && cDestino == cOrigen+1 && cOrigen != 2)
						|| (fDestino == fOrigen-1 && cDestino == cOrigen-1 && ((fOrigen == 1 && cOrigen == 1) || (fOrigen == 2 && cOrigen == 2)))
						|| (fDestino == fOrigen-1 && cDestino == cOrigen	 && fOrigen != 0)
						|| (fDestino == fOrigen-1 && cDestino == cOrigen+1 && ((fOrigen == 0 && cOrigen == 2) || (fOrigen == 1 && cOrigen == 1))) );
}

int HayGanador(int mat[][TABLERO], int FichaJugador)
{
	if(mat[0][0] == FichaJugador && mat[0][1] == FichaJugador && mat[0][2] == FichaJugador)
	{										// |X|X|X|
		return FichaJugador;	// | | | |
	}										// | | | |

	if(mat[1][0] == FichaJugador && mat[1][1] == FichaJugador && mat[1][2] == FichaJugador)
	{										// | | | |
		return FichaJugador;	// |X|X|X|
	}										// | | | |

	if(mat[2][0] == FichaJugador && mat[2][1] == FichaJugador && mat[2][2] == FichaJugador)
	{										// | | | |
		return FichaJugador;	// | | | |
	}										// |X|X|X|

	if(mat[0][0] == FichaJugador && mat[1][0] == FichaJugador && mat[2][0] == FichaJugador)
	{										// |X| | |
		return FichaJugador;	// |X| | |
	}										// |X| | |

	if(mat[0][1] == FichaJugador && mat[1][1] == FichaJugador && mat[2][1] == FichaJugador)
	{										// | |X| |
		return FichaJugador;	// | |X| |
	}										// | |X| |

	if(mat[0][2] == FichaJugador && mat[1][2] == FichaJugador && mat[2][2] == FichaJugador)
	{										// | | |X|
		return FichaJugador;	// | | |X|
	}										// | | |X|

	if(mat[0][0] == FichaJugador && mat[1][1] == FichaJugador && mat[2][2] == FichaJugador)
	{										// |X| | |
		return FichaJugador;	// | |X| |
	}										// | | |X|

	if(mat[0][2] == FichaJugador && mat[1][1] == FichaJugador && mat[2][0] == FichaJugador)
	{										// | | |X|
		return FichaJugador;	// | |X| |
	}										// |X| | |

	return -1;
}

void Juega_Hugo(char mat[TABLERO][TABLERO])
{
	int f,c;
	
	for(f = 0; f < TABLERO; ++f)
		for(c = 0; c < TABLERO; ++c)
			if(mat[f][c] == ' ')
			{
				mat[f][c] = 'X';
				return;		// Sin el return; Hugo pierde al toque!
			}
}
